package aceim.app.utils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import aceim.api.dataentity.Buddy;
import aceim.api.dataentity.PersonalInfo;
import aceim.app.dataentity.Account;
import aceim.app.dataentity.listeners.IHasAccount;
import aceim.app.dataentity.listeners.IHasAccountList;
import aceim.app.dataentity.listeners.IHasBuddy;
import aceim.app.dataentity.listeners.IHasFileProgress;
import aceim.app.dataentity.listeners.IHasMessages;
import aceim.app.utils.linq.KindaLinqRule;
import aceim.app.view.page.Page;
import aceim.app.view.page.chat.Chat;
import aceim.app.view.page.history.History;
import aceim.app.view.page.personalinfo.PersonalInfoPage;
import aceim.app.view.page.transfers.FileTransfers;
public class LinqRules {
public static final class AccountByProtocolUidLinqRule implements KindaLinqRule<Account> {
private final String protocolUid;
public AccountByProtocolUidLinqRule(String protocolUid) {
this.protocolUid = protocolUid;
}
@Override
public boolean match(Account t) {
return t != null && t.getProtocolUid().equals(protocolUid);
}
}
public static final class AccountPageLinqRule implements KindaLinqRule<Page> {
private final byte serviceId;
public AccountPageLinqRule(byte serviceId) {
this.serviceId = serviceId;
}
@Override
public boolean match(Page t) {
return (t instanceof IHasAccount) && ((IHasAccount)t).getAccount().getServiceId() == serviceId;
}
}
public static final class ProtocolAccountPageLinqRule implements KindaLinqRule<Page> {
private final String protocolServiceClassName;
public ProtocolAccountPageLinqRule(String protocolServiceClassName) {
this.protocolServiceClassName = protocolServiceClassName;
}
@Override
public boolean match(Page t) {
return (t instanceof IHasAccount) && ((IHasAccount)t).getAccount().getProtocolServicePackageName().equals(protocolServiceClassName);
}
}
public static final class AccountListPageLinqRule implements KindaLinqRule<Page> {
@Override
public boolean match(Page t) {
return (t instanceof IHasAccountList);
}
}
public static final class FileTransfersPageLinqRule implements KindaLinqRule<Page> {
private final byte serviceId;
public FileTransfersPageLinqRule(byte serviceId) {
this.serviceId = serviceId;
}
@Override
public boolean match(Page t) {
return (t instanceof FileTransfers) && ((FileTransfers)t).getAccount().getServiceId() == serviceId;
}
}
public static final class FileProgressPageLinqRule implements KindaLinqRule<Page> {
@Override
public boolean match(Page t) {
return (t instanceof IHasFileProgress);
}
}
public static final class BuddyPageLinqRule implements KindaLinqRule<Page> {
private final byte serviceId;
private final List<String> protocolUids;
public BuddyPageLinqRule(Buddy b) {
this.serviceId = b.getServiceId();
this.protocolUids = Arrays.asList(b.getProtocolUid());
}
public BuddyPageLinqRule(List<Buddy> b) {
if (b == null || b.size() < 1) {
this.serviceId = -1;
this.protocolUids = Collections.emptyList();
} else {
this.serviceId = b.get(0).getServiceId();
this.protocolUids = new ArrayList<String>(b.size());
for (Buddy bb : b) {
this.protocolUids.add(bb.getProtocolUid());
}
}
}
public BuddyPageLinqRule(byte serviceId, String buddyProtocolUid) {
this.serviceId = serviceId;
this.protocolUids = Arrays.asList(buddyProtocolUid);
}
@Override
public boolean match(Page t) {
boolean found = false;
for (String protocolUid : protocolUids) {
found |= (t instanceof IHasBuddy) && ((IHasBuddy)t).hasThisBuddy(serviceId, protocolUid);
}
return found;
}
}
public static final class MessagePageLinqRule implements KindaLinqRule<Page> {
private final byte serviceId;
private final String buddyUid;
public MessagePageLinqRule(byte serviceId, String buddyUid) {
this.serviceId = serviceId;
this.buddyUid = buddyUid;
}
@Override
public boolean match(Page t) {
return (t instanceof IHasMessages) && ((IHasMessages)t).hasMessagesOfBuddy(serviceId, buddyUid);
}
}
public static final class BuddyLinqRule implements KindaLinqRule<Buddy> {
private final Buddy b;
public BuddyLinqRule(Buddy b) {
this.b = b;
}
@Override
public boolean match(Buddy bu) {
return bu == b || (bu.getServiceId() == b.getServiceId() && bu.getProtocolUid().equals(b.getProtocolUid()));
}
}
public static final class ChatLinqRule implements KindaLinqRule<Page> {
private final Buddy b;
public ChatLinqRule(Buddy b) {
this.b = b;
}
@Override
public boolean match(Page t) {
if (t instanceof Chat) {
Buddy bu = ((Chat)t).getBuddy();
return bu.getServiceId() == b.getServiceId() && bu.getProtocolUid().equals(b.getProtocolUid());
} else {
return false;
}
}
}
public static final class PageIdLinqRule implements KindaLinqRule<Page> {
private final String pageId;
public PageIdLinqRule(String pageId) {
this.pageId = pageId;
}
@Override
public boolean match(Page t) {
return t.getPageId().equals(pageId);
}
}
public static final class StringCompareLinqRule implements KindaLinqRule<String> {
private final String s;
public StringCompareLinqRule(String s) {
this.s = s;
}
@Override
public boolean match(String t) {
return s.equals(t);
}
}
public static final class PersonalInfoLinqRule implements KindaLinqRule<Page> {
private final PersonalInfo info;
public PersonalInfoLinqRule(PersonalInfo info) {
this.info = info;
}
@Override
public boolean match(Page t) {
return (t instanceof PersonalInfoPage)
&& ((PersonalInfoPage) t).getInfo().getServiceId() == info.getServiceId()
&& ((PersonalInfoPage) t).getInfo().getProtocolUid().equals(info.getProtocolUid());
}
}
public static final class PageWithSmileysLinqRule implements KindaLinqRule<Page> {
@Override
public boolean match(Page t) {
return t instanceof Chat || t instanceof History;
}
}
}